---
sync_policy: engine_only
---
import { useState, useEffect, useCallback } from 'react';
import { {{moduleName}}Service } from './service';
import type { {{ModuleName}} } from './types';

/**
 * {{ModuleName}} 列表 Hook 返回值
 */
interface Use{{ModuleName}}ListResult {
  /** 列表数据 */
  data: {{ModuleName}}[];
  /** 加载状态 */
  loading: boolean;
  /** 错误信息 */
  error: string | null;
  /** 总记录数 */
  total: number;
  /** 当前页码 */
  page: number;
  /** 每页数量 */
  pageSize: number;
  /** 设置页码 */
  setPage: (page: number) => void;
  /** 刷新数据 */
  refresh: () => void;
}

/**
 * {{ModuleName}} 列表数据 Hook — 管理分页列表的加载、分页和刷新。
 * @param initialPage     初始页码，默认 1
 * @param initialPageSize 每页数量，默认 20
 * @returns 列表状态和操作方法
 */
export function use{{ModuleName}}List(
  initialPage = 1,
  initialPageSize = 20,
): Use{{ModuleName}}ListResult {
  const [data, setData] = useState<{{ModuleName}}[]>([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);
  const [total, setTotal] = useState(0);
  const [page, setPage] = useState(initialPage);
  const [pageSize] = useState(initialPageSize);

  // 根据 page 和 pageSize 拉取数据
  const fetchData = useCallback(async () => {
    setLoading(true);
    setError(null);
    try {
      const result = await {{moduleName}}Service.list({ page, size: pageSize });
      setData(result.records);
      setTotal(result.total);
    } catch (err) {
      setError(err instanceof Error ? err.message : '请求失败');
    } finally {
      setLoading(false);
    }
  }, [page, pageSize]);

  // 页码变化时自动刷新
  useEffect(() => {
    fetchData();
  }, [fetchData]);

  return {
    data,
    loading,
    error,
    total,
    page,
    pageSize,
    setPage,
    refresh: fetchData,
  };
}

/**
 * {{ModuleName}} 详情数据 Hook 返回值
 */
interface Use{{ModuleName}}DetailResult {
  /** 详情数据 */
  data: {{ModuleName}} | null;
  /** 加载状态 */
  loading: boolean;
  /** 错误信息 */
  error: string | null;
  /** 刷新数据 */
  refresh: () => void;
}

/**
 * {{ModuleName}} 详情数据 Hook — 根据 ID 加载单条 {{moduleName}} 详情。
 * @param id 主键标识，传入 null 时不发起请求
 * @returns 详情状态和刷新方法
 */
export function use{{ModuleName}}Detail(id: number | null): Use{{ModuleName}}DetailResult {
  const [data, setData] = useState<{{ModuleName}} | null>(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);

  const fetchData = useCallback(async () => {
    if (id === null) return;
    setLoading(true);
    setError(null);
    try {
      const result = await {{moduleName}}Service.getById(id);
      setData(result);
    } catch (err) {
      setError(err instanceof Error ? err.message : '请求失败');
    } finally {
      setLoading(false);
    }
  }, [id]);

  // ID 变化时自动加载
  useEffect(() => {
    fetchData();
  }, [fetchData]);

  return { data, loading, error, refresh: fetchData };
}
